package com.cassioso.redeneural.head;

import com.cassioso.redeneural.memoria.Forma;
import com.cassioso.redeneural.memoria.M;

public class Neuronio {

	/**
	 * Representa a lista de listaPeso atribuidos a entrada de cada neuronio
	 */
	private double[] listaPeso = new double[100];

	/**
	 * Representa a saída depois de calculado o somatório de cada entrada
	 * peloseu respectivo peso
	 */
	private double saida;
	
	private double erro;
	
	/**
	 * Método construtor: Define os valores iniciais para os atributos do neuronio
	 */
	public Neuronio() {
		this.listaPeso = new double[100];
		this.saida = 0.0;
	}

	/**
	 * Define a lista de pesos
	 */
	public void setListaPeso(double[] listaPeso) {
		this.listaPeso = listaPeso;
	}
	
	/**
	 * Define um peso específico
	 */
	public void setPeso(double peso, int i) {
		this.listaPeso[i] = peso;
	}

	/**
	 * Retorna o erro
	 */
	public double getErro(){
		return this.erro;
	}
	
	/**
	 * Define o erro
	 */
	public void setErro(double erro) {
		this.erro = erro;
	}
	
	/**
	 * Retorna a lista de pesos
	 */
	public double[] getListaPeso() {
		return listaPeso;
	}

	/**
	 * Retorna a saida
	 */
	public double getSaida() {
		return this.saida;
	}
	
	/**
	 * Define a saida
	 */
	public void setSaida(double saida) {
		this.saida = saida;
	}

	/**
	 * Retorna o somatório do produto de cada entrada pelo seu respectivo peso
	 */
	public void fazSomatorio(Neuronio listaEntrada[]){
		double somatorio = 0.0;
		for (int i = 0; i < 100; i++) {
			somatorio += listaEntrada[i].getSaida() * listaPeso[i];
			//System.out.println("Peso: "+listaPeso[i]+"\tEntrada: "+listaEntrada[i]+"\tSomatorio: "+somatorio);
		}
		this.saida = getAtivacao(somatorio);
	}
	
	/**
	 * Realiza a função de ativação
	 * numerador = 1-e^(-2*X)
	 * denominador = 1+e^(-2*X)
	 * f(x) = numerador / denominador;
	 */
	public double getAtivacao(double x) {
		//Numerador da função de ativação
		double numerador = (double)(1 - Math.pow(Math.E, -2 * x));
		// denominador da função de ativação
		double denominador = (double)(1 + Math.pow(Math.E, -2 * x));
		//Execução da função de ativação
		double retorno = numerador / denominador;
		return retorno;
	}

	
	public static void main(String cassioso[]) {
		Neuronio n = new Neuronio();
		Forma fc[] = M.lembrar();
		double x[][] = fc[0].getValor();
		double listaEntrada[] = new double[100];
		double listaPeso[] = new double[100];
		int l = 0;
		for (int i = 0; i < 10; i++) {
			for (int j = 0; j < 10; j++, l++) {
				listaEntrada[l] = x[i][j];
				listaPeso[l]= Math.random();
			}
		}
		n.setListaPeso(listaPeso);
		System.out.println(n.getSaida());
	}
}